home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / xulrunner / components / nsXULAppInstall.js < prev    next >
Encoding:
Text File  |  2007-11-12  |  7.9 KB  |  302 lines

  1. /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
  2. //@line 41 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  3.  
  4. const nsIFile             = Components.interfaces.nsIFile;
  5. const nsIINIParser        = Components.interfaces.nsIINIParser;
  6. const nsIINIParserFactory = Components.interfaces.nsIINIParserFactory;
  7. const nsILocalFile        = Components.interfaces.nsILocalFile;
  8. const nsISupports         = Components.interfaces.nsISupports;
  9. const nsIXULAppInstall    = Components.interfaces.nsIXULAppInstall;
  10. const nsIZipEntry         = Components.interfaces.nsIZipEntry;
  11. const nsIZipReader        = Components.interfaces.nsIZipReader;
  12.  
  13. function getDirectoryKey(aKey) {
  14.   try {
  15.     return Components.classes["@mozilla.org/file/directory_service;1"].
  16.       getService(Components.interfaces.nsIProperties).
  17.       get(aKey, nsIFile);
  18.   }
  19.   catch (e) {
  20.     throw "Couln't get directory service key: " + aKey;
  21.   }
  22. }
  23.  
  24. function createINIParser(aFile) {
  25.   return Components.manager.
  26.     getClassObjectByContractID("@mozilla.org/xpcom/ini-parser-factory;1",
  27.                                nsIINIParserFactory).
  28.     createINIParser(aFile);
  29. }
  30.  
  31. function copy_recurse(aSource, aDest) {
  32.   var e = aSource.directoryEntries;
  33.  
  34.   while (e.hasMoreElements()) {
  35.     var f = e.getNext().QueryInterface(nsIFile);
  36.     var leaf = f.leafName;
  37.  
  38.     var ddest = aDest.clone();
  39.     ddest.append(leaf);
  40.  
  41.     if (f.isDirectory()) {
  42.       copy_recurse(f, ddest);
  43.     }
  44.     else {
  45.       if (ddest.exists())
  46.         ddest.remove(false);
  47.  
  48.       f.copyTo(aDest, leaf);
  49.     }
  50.   }
  51. }
  52.  
  53. const PR_WRONLY = 0x02;
  54. const PR_CREATE_FILE = 0x08;
  55. const PR_TRUNCATE = 0x20;
  56.  
  57. function openFileOutputStream(aFile) {
  58.   var s = Components.classes["@mozilla.org/network/file-output-stream;1"].
  59.     createInstance(Components.interfaces.nsIFileOutputStream);
  60.   s.init(aFile, PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE, 0644, 0);
  61.   return s;
  62. }
  63.  
  64. /**
  65.  * An extractor implements the following prototype:
  66.  * readonly attribute nsIINIPaser iniParser;
  67.  * void copyTo(in nsILocalFile root);
  68.  */
  69.  
  70. function directoryExtractor(aFile) {
  71.   this.mDirectory = aFile;
  72. }
  73.  
  74. directoryExtractor.prototype = {
  75.   mINIParser : null,
  76.  
  77.   get iniParser() {
  78.     if (!this.mINIParser) {
  79.       var iniFile = this.mDirectory.clone();
  80.       iniFile.append("application.ini");
  81.  
  82.       this.mINIParser = createINIParser(iniFile);
  83.     }
  84.     return this.mINIParser;
  85.   },
  86.  
  87.   copyTo : function de_copyTo(aDest) {
  88.     // Assume the root already exists
  89.     copy_recurse(this.mDirectory, aDest);
  90.   }
  91. };
  92.  
  93. function zipExtractor(aFile) {
  94.   this.mZipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"].
  95.     createInstance(nsIZipReader);
  96.   this.mZipReader.init(aFile);
  97.   this.mZipReader.open();
  98.   this.mZipReader.test(null);
  99. }
  100.  
  101. zipExtractor.prototype = {
  102.   mINIParser : null,
  103.  
  104.   get iniParser() {
  105.     if (!this.mINIParser) {
  106.       // XXXbsmedberg: this is not very unique, guessing could be a problem
  107.       var f = getDirectoryKey("TmpD");
  108.       f.append("application.ini");
  109.       f.createUnique(nsIFile.NORMAL_FILE_TYPE, 0600);
  110.  
  111.       try {
  112.         this.mZipReader.extract("application.ini", f);
  113.         this.mINIParser = createINIParser(f);
  114.       }
  115.       catch (e) {
  116.         try {
  117.           f.remove();
  118.         }
  119.         catch (ee) { }
  120.  
  121.         throw e;
  122.       }
  123.       try {
  124.         f.remove();
  125.       }
  126.       catch (e) { }
  127.     }
  128.     return this.mINIParser;
  129.   },
  130.  
  131.   copyTo : function ze_CopyTo(aDest) {
  132.     var entries = this.mZipReader.findEntries("*");
  133.     while (entries.hasMoreElements()) {
  134.       var entry = entries.getNext().QueryInterface(nsIZipEntry);
  135.  
  136.       this._installZipEntry(this.mZipReader, entry, aDest);
  137.     }
  138.   },
  139.  
  140.   _installZipEntry : function ze_installZipEntry(aZipReader, aZipEntry,
  141.                                                  aDestination) {
  142.     var file = aDestination.clone();
  143.  
  144.     var path = aZipEntry.name;
  145.     var dirs = path.split(/\//);
  146.     var isDirectory = path.match(/\/$/) != null;
  147.  
  148.     var end = dirs.length;
  149.     if (!isDirectory)
  150.       --end;
  151.  
  152.     for (var i = 0; i < end; ++i) {
  153.       file.append(dirs[i]);
  154.       if (!file.exists()) {
  155.         file.create(nsIFile.DIRECTORY_TYPE, 0755);
  156.       }
  157.     }
  158.  
  159.     if (!isDirectory) {
  160.       file.append(dirs[end]);
  161.       aZipReader.extract(path, file);
  162.     }
  163.   }
  164. };
  165.  
  166. function createExtractor(aFile) {
  167.   if (aFile.isDirectory())
  168.     return new directoryExtractor(aFile);
  169.  
  170.   return new zipExtractor(aFile);
  171. }
  172.  
  173. const AppInstall = {
  174.  
  175.   /* nsISupports */
  176.   QueryInterface : function ai_QI(iid) {
  177.     if (iid.equals(nsIXULAppInstall) ||
  178.         iid.equals(nsISupports))
  179.       return this;
  180.  
  181.     throw Components.result.NS_ERROR_NO_INTERFACE;
  182.   },
  183.  
  184.   /* nsIXULAppInstall */
  185.   installApplication : function ai_IA(aAppFile, aDirectory, aLeafName) {
  186.     var extractor = createExtractor(aAppFile);
  187.     var iniParser = extractor.iniParser;
  188.  
  189.     var appName = iniParser.getString("App", "Name");
  190.  
  191.     // vendor is optional
  192.     var vendor;
  193.     try {
  194.       vendor = iniParser.getString("App", "Vendor");
  195.     }
  196.     catch (e) { }
  197.  
  198.     if (aDirectory == null) {
  199. //@line 238 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  200.       aDirectory = getDirectoryKey("ProgF");
  201.       if (vendor)
  202.         aDirectory.append(vendor);
  203. //@line 254 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  204.     }
  205.     else {
  206.       aDirectory = aDirectory.clone();
  207.     }
  208.  
  209.     if (!aDirectory.exists()) {
  210.       aDirectory.create(nsIFile.DIRECTORY_TYPE, 0755);
  211.     }
  212.  
  213.     if (aLeafName == "") {
  214. //@line 268 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  215.       aLeafName = appName;
  216. //@line 273 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  217.     }
  218.  
  219.     aDirectory.append(aLeafName);
  220.     if (!aDirectory.exists()) {
  221.       aDirectory.create(nsIFile.DIRECTORY_TYPE, 0755);
  222.     }
  223.  
  224. //@line 344 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  225.     extractor.copyTo(aDirectory);
  226.  
  227.     var xulrunnerBinary = getDirectoryKey("XCurProcD");
  228.     xulrunnerBinary.append("xulrunner-stub.exe");
  229.  
  230.     xulrunnerBinary.copyTo(aDirectory, appName.toLowerCase() + ".exe");
  231. //@line 351 "/c/mozilla/xulrunner/setup/nsXULAppInstall.js"
  232.   }
  233. };
  234.  
  235. const AppInstallFactory = {
  236.   /* nsISupports */
  237.   QueryInterface : function aif_QI(iid) {
  238.     if (iid.equals(Components.interfaces.nsIFactory) ||
  239.         iid.equals(nsISupports))
  240.       return this;
  241.  
  242.     throw Components.results.NS_ERROR_NO_INTERFACE;
  243.   },
  244.  
  245.   /* nsIFactory */
  246.   createInstance : function aif_CI(aOuter, aIID) {
  247.     if (aOuter)
  248.       throw Components.results.NS_ERROR_NO_AGGREGATION;
  249.  
  250.     return AppInstall.QueryInterface(aIID);
  251.   },
  252.  
  253.   lockFactory : function aif_lock(aLock) { }
  254. };
  255.  
  256. const AppInstallContractID = "@mozilla.org/xulrunner/app-install-service;1";
  257. const AppInstallCID = Components.ID("{00790a19-27e2-4d9a-bef0-244080feabfd}");
  258.  
  259. const AppInstallModule = {
  260.   /* nsISupports */
  261.   QueryInterface : function mod_QI(iid) {
  262.     if (iid.equals(Components.interfaces.nsIModule) ||
  263.         iid.equals(nsISupports))
  264.       return this;
  265.  
  266.     throw Components.results.NS_ERROR_NO_INTERFACE;
  267.   },
  268.  
  269.   /* nsIModule */
  270.   getClassObject : function mod_gco(aCompMgr, aClass, aIID) {
  271.     if (aClass.equals(AppInstallCID))
  272.       return AppInstallFactory.QueryInterface(aIID);
  273.  
  274.     return Components.results.NS_ERROR_FACTORY_NOT_REGISTERED;
  275.   },
  276.  
  277.   registerSelf : function mod_regself(aCompMgr, aLocation,
  278.                                       aLoaderStr, aType) {
  279.     var reg = aCompMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  280.     reg.registerFactoryLocation(AppInstallCID,
  281.                                 "nsXULAppInstall",
  282.                                 AppInstallContractID,
  283.                                 aLocation,
  284.                                 aLoaderStr,
  285.                                 aType);
  286.   },
  287.  
  288.   unregisterSelf : function mod_unreg(aCompMgr, aLocation, aLoaderStr) {
  289.     var reg = aCompMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
  290.     reg.unregisterFactoryLocation(AppInstallCID,
  291.                                   aLocation);
  292.   },
  293.  
  294.   canUnload : function mod_unload(aCompMgr) {
  295.     return true;
  296.   }
  297. };
  298.  
  299. function NSGetModule(compMgr, fileSpec) {
  300.   return AppInstallModule;
  301. }
  302.